package DAOHibernate;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import modelo.Comentario;
import modelo.Tesina;
import modelo.Usuario;
import DAO.ComentarioDAO;
import acceso.EMF;

public class ComentarioDAOhiberjpa implements ComentarioDAO {

	public Collection<Comentario> obtenerComentariosporIdTesis(Long idTesis) {

		EntityManager em = EMF.getEMF().createEntityManager();
		EntityTransaction etx = em.getTransaction();
		etx.begin();
		Collection<Comentario> resultado = new ArrayList<Comentario>();

		@SuppressWarnings("unchecked")
		List<Comentario> comentarios = (List<Comentario>) (em
				.createQuery("FROM Comentario WHERE tesina.id = " + idTesis
						+ " ORDER BY id DESC")).getResultList();

		for (Comentario com : comentarios) {
			Comentario comentarioRecuperado = new Comentario();
			comentarioRecuperado.setId(com.getId());
			comentarioRecuperado.setTexto(com.getTexto());
			comentarioRecuperado.setTesina(com.getTesina());
			comentarioRecuperado.setUsuario(com.getUsuario());
			comentarioRecuperado.setFechaHora(com.getFechaHora());
			resultado.add(comentarioRecuperado);
		}
		em.close();
		etx.commit();
		return resultado;
	}

	public void agregarComentario(Tesina tesis, Usuario usuario, String texto) {

		try {

			EntityManager em = EMF.getEMF().createEntityManager();

			EntityTransaction etx = em.getTransaction();
			etx.begin();
			Comentario comentario = new Comentario();
			comentario.setTexto(texto);
			comentario.setUsuario(usuario);
			comentario.setTesina(tesis);
			Long maximoId = new Long(0);
			@SuppressWarnings("unchecked")
			List<Comentario> comentarios = (List<Comentario>) (em
					.createQuery("FROM Comentario WHERE id = (select max(id) as maxID from Comentario)"))
					.getResultList();
			for (Comentario com : comentarios) {
				maximoId = com.getId();
			}
			maximoId++;
			comentario.setId(maximoId);
			em.persist(comentario);
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}
	}

	@SuppressWarnings("null")
	public void eliminarComentariosPorTesis(Long idTesis) {

		Collection<Comentario> collComent = obtenerComentariosporIdTesis(idTesis);
		if (collComent != null || !collComent.isEmpty()) {
			Iterator<Comentario> it = collComent.iterator();

			while (it.hasNext()) {
				Comentario coment = it.next();
				this.eliminarComentario(coment.getId()); // <-Fetched																				
			}

		}

	}
	

	
	public void eliminarComentario(Long idComentario) {
		try {
			EntityManager em = EMF.getEMF().createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			Query consulta = em.createQuery(
					"DELETE FROM Comentario E where E.id=:id").setParameter("id",
							idComentario);
			consulta.executeUpdate();
			etx.commit();
			em.close();
			} catch (Exception e) {
				e.getMessage();
			}

		}

	@Override
	public void agregarComentario(Tesina tesis, Usuario usuario,
			String comentario, String format) {
		try {

			Comentario c = new Comentario();
			c.setTexto(comentario);
			c.setUsuario(usuario);
			c.setTesina(tesis);
			c.setFechaHora(format);
			Long maximoId = new Long(0);
			EntityManager em = EMF.getEMF().createEntityManager();
			EntityTransaction etx = em.getTransaction();
			@SuppressWarnings("unchecked")
			List<Comentario> comentarios = (List<Comentario>) (em
					.createQuery("FROM Comentario WHERE id = (select max(id) as maxID from Comentario)"))
					.getResultList();
			for (Comentario com : comentarios) {
				maximoId = com.getId();
			}
			maximoId++;
			c.setId(maximoId);
			
			etx.begin();
			em.persist(c);
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}
	}

}
